perm filename PCALL.FAI[MUS,LCS] blob sn#088115 filedate 1974-02-21 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	BUFFER
C00005 00003	PLA2:	SETZM FILBLK+3
C00010 ENDMK
C⊗;
	TITLE	BUFFER;
	INTERNAL PLAY

;  CALL PLAY(FILENAME,SPEED,NCHNS)

A   ←   1     ;WORK
B   ←   2     ;WORK
RET ←   3     ;RETURN ACCUMULATOR
BUFSIZ ←=2048   
↓DSKCHN ←1             ;DISK CHANNEL FOR INPUT
↓ADCHN  ←2             ;D-A CHANNEL FOR OUTPUT
NWD:	0			;FOR NUMBER OF WORDS OF INPUT.
↓BUF1:	BLOCK	BUFSIZ+1	;BUFFER 1
BUF2:	BLOCK	BUFSIZ+1	;BUFFER 2

FILBLK: 0        		;FILENAME FOR INPUT
	'DMD   '			;EXTENSION
	0			;INFORMATION ON FILE
	0			;PROJECT PROG#


CLIST:	IOWD	1,NWD		;FOR THE FIRST RECORD
	0

INLIST:	0			;WILL CONTAIN AN IOWD
	0

OUTWC:	0			;WILL CONTAIN AN IOWD FOR D-A
	3650			;MAGIC BITS FOR 136.
OUTBIT: 4000			;BITS FOR D-A
	BLOCK	2

	OPDEF	READCH [51B8]
        OPDEF   MESSAGE[51B8!3B12]

PLAY:	0
	CALLI	0,0         ;RESET I/O DEVICES
 	OPEN 	DSKCHN,[17  ;MODE
		'DSK   '    ;DEVICE NAME
 		0]          ;NO BUFFER HEADERS
	HALT	PLAY        ;RESTART IF DEVICE IS UNAVAILABLE

	SETZM	FILBLK+3    ;FOR RESTART
;;LX:	MESSAGE [ASCIZ/
;;  TYPE `P' TO PLAY FROM DISK
;;/]
;;	readch a
;;	caie a,"P"
;;	jrst lx
;;	skipe filblk+3	;is this first time through ?
;;	jrst pla2	;No. Parameters already set up.
	;FIND OUT NUMBER OF CHANNELS AND
	;THE SPEED.

;	MESSAGE	[ASCIZ/HOW MANY CHANNELS? /]
;	READCH	A
;	SUBI	A,"0"+1		;CONVERT TO BINR AND ADD 1
	MOVE	A,@1(16)
	SUBI 	A,1
	DPB	A,[POINT 2,OUTBIT,26]

;	MESSAGE [ASCIZ/ WHAT IS THE SPEED? /]
;	READCH  A
;	SUBI	A,"0"
	MOVE	A,@2(16)
	DPB	A,[POINT 3,OUTBIT,32]

;	LX:	MESSAGE [ASCIZ/
;	  TYPE `P' TO PLAY FROM DISK OR `E' TO EXIT
;	/]
;	readch a
;	cain a,"E"
;	JRA 16,3(16)
;	caie a,"P"
;	jrst lx

PLA2:	SETZM FILBLK+3
	MOVE 	A,(16)		;ADR OF FILENAME
	SUBI 	A,1
	HRLI	A,000700	;BYTE POINTER
	MOVEI	B,FILBLK	;ADDRESS FOR SIXBIT
	SUBI	B,1
	HRLI	B,000600
	MOVEI	0,0
	SUBI	0,5
	
SIXCNV:	ILDB	4,A
	ADDI	4,40
	IDPB	4,B
	AOJL	0,SIXCNV


	LOOKUP	DSKCHN,FILBLK
	JRST	[MESSAGE[ASCIZ/
		*** MUSIC FILE NOT FOUND/]
		JRA 16,3(16)]
        ;EXIT IF FILE IS MISSING

XOPEN:	MOVSI	'XGP'	;DOWN TO XGPOK FOR XGP CONFLICT.
	DEVUSE	0,	
	HLRZ 	0,0
	CAIN	400000
	JRST	XGPOK
	INIT	16,17
	SIXBIT	.XGP.
	0
	JRA	16,3(16)
XGPOK:	OPEN	ADCHN,[117 	;MODE
         	'AD    '        ;DEVICE NAME
 		0]              ;NO BUFFER HEADERS

  	JRST	[MESSAGE[ASCIZ/
		***D-A NOT AVAILABLE/]
		JRA 16,3(16)]
	;EXIT IF D-A IS UNAVAILABLE

SPWAR:	SPCWAR 17,[CALLI]
;	MESSAGE [ASCIZ/ GO? /]
;	READCH A


LNTH:	movs a,filblk+3		;get length of file.
	movnm a,nwd

;	-----------------------------------------

	;BEGIN MAIN BODY OF PROGRAM

LOOP:	JSP	RET,SUB		;ROUTINE TO READ AND WRITE
	BUF1-1 			;USE BUF1 FOR THE I/O
	JUMPLE	B,OUT    	;DONE
	
	JSP	RET,SUB		;CALL IT AGAIN
	BUF2-1			;USE BUF2 FOR THE I/O
	JUMPG	B,LOOP		;GO BACK FOR MORE IF B>0

OUT:	close dskchn,		;END OF PROGRAM.
	releas adchn,
	RELEASE 16,
	SPCWAR 0,'SSW'
	JRA 16,3(16)
;	jrst lx

	;SUBROUTINE TO SET UP IOWD AND READ AND WRITE.
	;  1(RET) WILL BE THE RETURN
	;  0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
	;         PUT IN THE RIGHT HALF OF THE IOWD.
	;  A      WILL BE A WORK REGISTER
    	;  B      WILL BE TESTED ON THE OUTSIDE.

SUB:	MOVNI	A,BUFSIZ	;PICK UP AND COMPLEMENT BUFSIZ
	ADDB	A,NWD		;A←NWD-BUFSIZ
				;NWD←NWD-BUFSIZ
	MOVE	B,A		;SAVE B TO BE TESTED FOR LAST
				;TIME.
	JUMPL	A,LAST		;SET UP FOR LAST TIME.
	MOVEI	A,0		

	;THE IOWD LOOKS LIKE:
	;  [-BUFSIZ / BUFI-1]

LAST:	ADDI	A,BUFSIZ
	MOVNS	A		;COMPLEMENT A
	HRL	A,0(RET)	;PICK UP BUFI AND MOVE IT
				;TO THE LEFT SIDE OF A.
	MOVSM	A,INLIST	;SWAP A AND MOVE IT.
	MOVSM	A,OUTWC		;SAME FOR OUTPUT.
	INPUT	DSKCHN,INLIST	;READ A RECORD.
	OUTPUT	ADCHN,OUTWC	;WRITE THE RECORD.
	JRST	1(RET)		;RETURN

END